import { ref, computed } from 'vue'
import { defineStore } from 'pinia'


const USER_KEY = "OA_USER_KEY"
const TOKEN_KEY = "OA_TOKEN_KEY"

// 定义权限控制
export const PermissionChoices = {
    All:0b111,  
    Staff:0b000,
    Boarder:0b001,
    Leader:0b010,
}

export const useAuthStore = defineStore('auth', () => {
    let _user = ref({})
    let _token = ref("")

    // 退出登录
    function clearUserToken(){
        // 清除内存和本地中的 user 和 key
        _user.value = {}
        _token.value =""
        localStorage.removeItem(USER_KEY)
        localStorage.removeItem(TOKEN_KEY)
    }

    function setUserToken(user,token){
        // 保存到对象上(内存中) 
        _user.value = user;
        _token.value = token;

        // 存储到浏览器的 localStorage中(硬盘上)
        localStorage.setItem(USER_KEY,JSON.stringify(user))
        localStorage.setItem(TOKEN_KEY,token)
    }

    // 计算属性 关闭浏览器后快速加载
    let user = computed(()=>{
        // 如果 _user是一个空对象 那么就试图从 localStorage 中读取
        // 在 JS 中 如果是 空对象的话 {} 使用 if判断 会直接返回 true 需要 使用 Object.keys(_user.value).length == 0 判断长度
        // 但如果是空字符串的话 使用 if 判断 就会返回 false
        if(Object.keys(_user.value).length == 0){
            let user_str = localStorage.getItem(USER_KEY)
            if(user_str){
                _user.value = JSON.parse(user_str)
            }
        }
        return _user.value
    })
    let token = computed(()=>{
        // 如果 _user是一个空对象 那么就试图从 localStorage 中读取
        if(!_token.value){
            let token_str =  localStorage.getItem(TOKEN_KEY)
            if(token_str){
                _token.value = token_str
            }
        }
        return _token.value
    }) 
    // 定义登录的逻辑
    let is_logined = computed(()=>{
        if(Object.keys(user.value).length>0 && token.value){
            return true;
        }
        return false;
    })
    // 计算属性 用于获取当前用户用于哪些权限
let own_permissions = computed(()=>{
    // 默认具有普通员工的权限
    let _permissions = PermissionChoices.Staff

    if(is_logined.value){
        // 判断是不是董事会 
        if(user.value.department.name=='董事会'){
            _permissions |= PermissionChoices.Boarder  // 0b000 | 0b001 = 0b001
        }
        // 判断是不是 teamleader
        if(user.value.department.leader_id == user.value.uid){
            _permissions |= PermissionChoices.Leader    // 0b000 | 0b010 = 0b010
        }
    }
    return _permissions
})

// 对外提供一个函数 让用户自己去判断用于哪些权限
function has_permission(permissions,opt='|'){
    let results = permissions.map((permission)=>(permission&own_permissions.value)==permission)
    if(opt == "|"){
        if(results.indexOf(true)>=0){
            return true
        }else{
            return false
        }
    }else{
        if(results.indexOf(false)>=0){
            return false
        }else{
            return true
        }
    }
}

    // 返回给外界使用
  return { setUserToken, user, token,is_logined,clearUserToken,has_permission}
})
